/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Comprobar_pass;

import java.util.ArrayList;

/**
 *
 * @author Javi
 */
public class Puntuacion {
    String texto;
    int puntuacion;
    int puntuacion_adicional;
    int puntuacion_deduccion;
    private static final int SECUENCIA = 3; 
            
    String[] vector_Minusculas = {"a", "b", "c", "d", "e", "f", "g", "h", "i",
            "j", "k", "l", "m", "n", "ñ", "o", "p", "q", "r", "s", "t", "u","v", 
            "w", "x", "y", "z"};
    String[] vector_Mayusculas = {"A", "B", "C", "D", "E", "F", "G", "H", "I",
            "J", "K", "L", "M", "N", "Ñ", "O", "P", "Q", "R", "S", "T", "U",
            "V", "W", "X", "Y", "Z"};
    String[] vector_Caracteres_raros = {"|", "@", "#", "~", "€", "¬", "!", "·", 
            "$", "%", "&", "/", "(", ")", "=", "?", "¿", "<", ">", ",", ".", 
            "-", "_"};
    String[] vector_Numeros = {"1", "2", "3", "4", "5", "6", "7", "8", "9"};
    
    public int resultado(String texto){
        puntuacion = Adicional(texto) - Deduccion(texto);
        
        if(puntuacion <= 0){
            puntuacion = 0;
        }
        return puntuacion;
    }
    
    private int Adicional(String texto){      
//        System.out.println("*********************************************");
//        System.out.println("            ADICIONAL");
//        System.out.println("*********************************************\n");
        
        int numero_caracteres = Numero_de_Caracteres(texto);
        int mayuscula = Contiene_Mayusculas(texto);
        int minuscula = Contiene_Minusculas(texto);
        int numero = Contiene_Numeros(texto);
        int raros = Contiene_Caracteres_Raros(texto);        
        int simbolos_o_numeros = Numeros_O_Simbolos(texto);
        int requerimientos = requerimientos_minimos(texto);
  
        
        puntuacion_adicional = numero_caracteres + mayuscula + minuscula + 
                numero + raros + simbolos_o_numeros + requerimientos;
        
//        System.out.println("Puntuacion adicional " +puntuacion_adicional);
        return puntuacion_adicional;
    }
    
    private int Deduccion(String texto){
//        System.out.println("*********************************************");
//        System.out.println("             DEDUCCION");
//        System.out.println("*********************************************\n");
        
        puntuacion_deduccion = 0;
          
        int solo_letras = Comprobar_Solo_Letras(texto);
        int solo_numeros = Comprobar_Solo_Numero(texto);
        int caracteres_repetidos = Caracteres_Repetidos(texto);
        int mayusculas_consecutivas = Comprobar_mayusculas_Consecutivas(texto);
        int minusculas_consecutivas = Comprobar_Minusculas_Consecutivas(texto);
        int numeros_consecutivos = Comprobar_Numeros_Consecutivos(texto);
        int secuencia_letras = Secuencia_Numeros(texto);
   
        
        
        puntuacion_deduccion = solo_letras + solo_numeros + 
                + caracteres_repetidos + mayusculas_consecutivas
                + minusculas_consecutivas + numeros_consecutivos + secuencia_letras;
        
        return puntuacion_deduccion;
    }
    
    
    /*
     * ***********************************************************************
     * ***********************************************************************
     *                          ADICIONES
     * ***********************************************************************
     * *********************************************************************** 
     */
    
    /*
     * Metodo para comprobar cuantos caracteres se compone el texto
     */
    private int Numero_de_Caracteres (String texto){
//        System.out.println("*********************************************");
//        System.out.println("              NUMERO DE CARACTERES");
//        System.out.println("*********************************************\n");
        int puntuacion_longitud;
        int numero_caracteres = texto.length();
        puntuacion_longitud = (numero_caracteres)*4;
//        System.out.println("Numero de caracteres que contien: " 
//                +numero_caracteres);
//        System.out.println("Puntuación número de caracteres: " 
//                + puntuacion_longitud);
//        System.out.println("    \n");
        return puntuacion_longitud;
    }
    
    
    /*
     * Metodo para comprobar cuantas Mayusculas contiene el texto
     */  
    private int Contiene_Mayusculas (String texto){
//        System.out.println("*********************************************");
//        System.out.println("             CONTIENE MAYUSCULAS");
//        System.out.println("*********************************************\n");
        int numero_mayusculas=0;
        int puntuacion_mayuscula;
        int numero_caracteres = texto.length();
        int x, j;
        
        for (x=0;x<texto.length();x++){     
            for (j=0; j<vector_Mayusculas.length; j++) {
                if (vector_Mayusculas[j].equals(texto.charAt(x)+"")){
                   numero_mayusculas = numero_mayusculas + 1; 
                }
            }           
        }
        if(numero_mayusculas == 0){
            puntuacion_mayuscula = 0;
        }else {
            puntuacion_mayuscula = (numero_caracteres - numero_mayusculas)*2;
        }        
//        System.out.println("Numero de MAYUSCULAS que contiene: " 
//                +numero_mayusculas);
//        System.out.println("Puntuación número de MAYUSCULAS: " 
//                + puntuacion_mayuscula);
//        System.out.println("    \n");
        return puntuacion_mayuscula;
    }  
    
    /*
     * Metodo para comprobar cuantas Minusculas contiene el texto
     */
    private int Contiene_Minusculas (String texto){
//        System.out.println("*********************************************");
//        System.out.println("              CONTIENE MINUSCULAS");
//        System.out.println("*********************************************\n");
        int numero_minusculas=0;
        int numero_caracteres = texto.length();
        int puntuacion_minuscula;
        int i, j;
        for (int x=0;x<texto.length();x++){     
            for (j=0; j<vector_Minusculas.length; j++) {
                if (vector_Minusculas[j].equals(texto.charAt(x)+"")){
                   numero_minusculas = numero_minusculas + 1; 
                }
            }            
        }
        if(numero_minusculas == 0){
            puntuacion_minuscula = 0;
        }else{
            puntuacion_minuscula = (numero_caracteres - numero_minusculas)*2;
        }        
//        System.out.println("Numero de MINISCULAS que contiene: " 
//                +numero_minusculas);
//        System.out.println("Puntuación número de Minusculas: " 
//                + puntuacion_minuscula);
//        System.out.println("    \n");
        return puntuacion_minuscula;
    }
    
    /*
     * Metodo para comprobar cuantas Caracteres raros tiene
     */
    private int Contiene_Caracteres_Raros (String texto){
//        System.out.println("*********************************************");
//        System.out.println("             CONTIENE CARACTERES RAROS");
//        System.out.println("*********************************************\n");
        int numero_caracteres_raros=0;
        int puntuacion_raros;
        int i, j;
        for (int x=0;x<texto.length();x++){     
            for (j=0; j<vector_Caracteres_raros.length; j++) {
                if (vector_Caracteres_raros[j].equals(texto.charAt(x)+"")){
                   numero_caracteres_raros = numero_caracteres_raros + 1; 
                }
            }             
        }
        if(numero_caracteres_raros == 0){
            puntuacion_raros = 0;
        }else{
            puntuacion_raros = (numero_caracteres_raros*6); 
        }        
//        System.out.println("Numero de Caracteres rarps que contiene: " 
//                +numero_caracteres_raros);
//        System.out.println("Puntuación número de Caracteres raros: " 
//                + puntuacion_raros);
//        System.out.println("    \n");
        return puntuacion_raros;
    }
    
    /*
     * Metodo para comprobar cuantas Numeros contiene
     */
    private int Contiene_Numeros(String texto){
//        System.out.println("*********************************************");
//        System.out.println("             CONTIENE NUMEROS");
//        System.out.println("*********************************************\n");
        int numeros=0;
        int puntuacion_numeros;
        int i, j;
        for (int x=0;x<texto.length();x++){     
            for (j=0; j<vector_Numeros.length; j++) {
                if (vector_Numeros[j].equals(texto.charAt(x)+"")){
                   numeros = numeros + 1; 
                }
            } 
            
        }
        if(numeros == 0){
            puntuacion_numeros = 0;
        }else{
            puntuacion_numeros = (numeros*4); 
        }        
//        System.out.println("Numero de Numeros que contiene: " +numeros);
//        System.out.println("Puntuación número de numeros: " 
//                + puntuacion_numeros);
//        System.out.println("    \n");
        return puntuacion_numeros;
    }
     
    /*
     * Metodo para comprobar si la mitad de la contraseña contiene numeros
     * o caracteres raros
     */
    private int Numeros_O_Simbolos(String texto){
//        System.out.println("*********************************************");
//        System.out.println("              CONTIENE MITAD NUMEROS O SIMBOLOS");
//        System.out.println("*********************************************\n");
        int j, puntuacion_numeros_o_simbolos;
        int numeros = 0;
        int caracteres = 0;
        int mitad;
        for (int x=0;x<texto.length();x++){     
            for (j=0; j<vector_Numeros.length; j++) {
                if (vector_Numeros[j].equals(texto.charAt(x)+"")){
                   numeros = numeros + 1; 
                }
            } 
        }
        
        for (int x=0;x<texto.length();x++){     
            for (j=0; j<vector_Caracteres_raros.length; j++) {
                if (vector_Caracteres_raros[j].equals(texto.charAt(x)+"")){
                   caracteres = caracteres+ 1; 
                }
            } 
        }
        mitad = (texto.length())/2;
        
        if(numeros >= mitad)
        {
            puntuacion_numeros_o_simbolos = numeros * 2;
        } 
        else if (caracteres >= mitad){
            puntuacion_numeros_o_simbolos = caracteres *2;
        }else {
            puntuacion_numeros_o_simbolos = 0;
        }
        
//        System.out.println("Midad de Numeros o simbolos que contiene: ");
//        System.out.println("Puntuación mitad de números o simbolos: " 
//                + puntuacion_numeros_o_simbolos);
//        System.out.println("    \n");
                
        return puntuacion_numeros_o_simbolos;
    }
    
    /*
     * Metodo para comprobar si cumple los requerimientos minimos si tiene 
     * longitud de mayor o igual de 8 caracteres, y Contener al menos 3-4 de las
     * siguientes cosas: Letras en Mayúsculas, Letras en Minúsculas, Números
     * Símbolos
     */
    private int requerimientos_minimos (String texto){
//        System.out.println("*********************************************");
//        System.out.println("              REQUERIMIENTOS MINIMOS");
//        System.out.println("*********************************************\n");
        int minimo = 8;
        int puntuacion_requerimientos_minimos;
        int numero_condicion = 0;
        
        if(texto.length() >= minimo){
            numero_condicion = numero_condicion + 1; 
        }        
        int mayuscula = Contiene_Mayusculas(texto);
        int minuscula = Contiene_Minusculas(texto);
        int raros = Contiene_Caracteres_Raros(texto);
        int numero = Contiene_Numeros(texto);
        
        if(mayuscula != 0){
            numero_condicion = numero_condicion + 1;
        }
        if(minuscula != 0){
            numero_condicion = numero_condicion + 1;
        }
        if(raros != 0){
            numero_condicion = numero_condicion + 1;
        }
        if(numero != 0){
            numero_condicion = numero_condicion + 1;
        }
        
        puntuacion_requerimientos_minimos = numero_condicion * 2;
//        System.out.println("REQUERIMIENTOS: ");
//        System.out.println("Puntuación de requerimientos: " 
//                + puntuacion_requerimientos_minimos);
//        System.out.println("    \n");
        return puntuacion_requerimientos_minimos;
    }
     
    /*
     * ***********************************************************************
     * ***********************************************************************
     *                          DEDUCCIONES
     * ***********************************************************************
     * *********************************************************************** 
     */
    
    
    /*
     * Metodo para comprobar si la contraseña contiene solo letras
     */
    private int Comprobar_Solo_Letras(String texto){
//        System.out.println("*********************************************");
//        System.out.println("              COMPROBAR SOLO LETRAS");
//        System.out.println("*********************************************\n");
        int puntuacion_comprobar_solo_letras;
        
        int raros = Contiene_Caracteres_Raros(texto);
        int numero = Contiene_Numeros(texto);
        
        if(numero == 0 & raros == 0){
            puntuacion_comprobar_solo_letras = texto.length();
        }else{
            puntuacion_comprobar_solo_letras = 0;
        }
//        System.out.println("COMPROBAR SOLO LETRAS: ");
//        System.out.println("Puntuación de solo letras: " + puntuacion_comprobar_solo_letras);
//        System.out.println("    \n");
        
        return puntuacion_comprobar_solo_letras;
    }
    
    /*
     * Metodo para comprobar si la contraseña contiene solo numeros
     */
    private int Comprobar_Solo_Numero(String texto){
//        System.out.println("*********************************************");
//        System.out.println("              COMPROBAR SOLO NUMEROS");
//        System.out.println("*********************************************\n");
        
        int puntuacion_comprobar_solo_numero;
        int mayuscula = Contiene_Mayusculas(texto);
        int minuscula = Contiene_Minusculas(texto);
        int raros = Contiene_Caracteres_Raros(texto);
        
        if(mayuscula == 0 & minuscula == 0 & raros == 0){
            puntuacion_comprobar_solo_numero = texto.length();
        }else{
            puntuacion_comprobar_solo_numero = 0;
        }
        
//        System.out.println("COMPROBAR SOLO NUMEROS: ");
//        System.out.println("Puntuación de solo numeros: " + puntuacion_comprobar_solo_numero );
//        System.out.println("    \n");
        
        return puntuacion_comprobar_solo_numero;
    }  
    
    /*
     * Método para comprobar que hay mayusculas consecutivas
     */    
    private int Comprobar_mayusculas_Consecutivas(String texto){
//        System.out.println("*********************************************");
//        System.out.println("              COMPROBAR MAYUSCULAS CONSECUTIVAS");
//        System.out.println("*********************************************\n");
        int i;
        int repetidas = 0;
        int puntuacion_mayusculas_repetidas;
        
        for(i=1; i<texto.length(); i++){
            if((texto.charAt(i)+"").equals(texto.charAt(i - 1) + "")){
                repetidas = repetidas + 1;
            }
        }
        
        puntuacion_mayusculas_repetidas = repetidas * 2;
        
//        System.out.println("COMPROBAR MAYUSCULAS REPETIDAS: " +repetidas);
//        System.out.println("Puntuación de mayusculas repetidas: " 
//                + puntuacion_mayusculas_repetidas);
//        System.out.println("    \n");
        return puntuacion_mayusculas_repetidas;
    }
    
    
    /*
     * Método para comprobar que hay minusculas consecutivas
     */
    private int Comprobar_Minusculas_Consecutivas(String texto){
//        System.out.println("*********************************************");
//        System.out.println("              COMPROBAR MINUSCULAS CONSECUTIVAS");
//        System.out.println("*********************************************\n");
        int i;
        int repetidas = 0;
        int puntuacion_minusculas_repetidas;
        
        for(i=1; i<texto.length(); i++){
            if((texto.charAt(i)+"").equals(texto.charAt(i - 1) + "")){
                repetidas = repetidas + 1;
            }
        }
        
        puntuacion_minusculas_repetidas = repetidas * 2;
        
        System.out.println("COMPROBAR MINUSCULAS REPETIDAS: " + repetidas);
        System.out.println("Puntuación de minusculas repetidas: " 
                + puntuacion_minusculas_repetidas);
        System.out.println("    \n");
        return puntuacion_minusculas_repetidas;
    }
    
    /*
     * Método para comprobar que hay numeros consecutivos
     */
    private int Comprobar_Numeros_Consecutivos(String texto){
//        System.out.println("*********************************************");
//        System.out.println("              COMPROBAR NUMEROS CONSECUTIVOS");
//        System.out.println("*********************************************\n");
        int i;
        int repetidos = 0;
        int puntuacion_numeros_repetidos;
        
        for(i=1; i<texto.length(); i++){
            if((texto.charAt(i)+"").equals(texto.charAt(i - 1) + "")){
                repetidos = repetidos + 1;
            }
        }
        puntuacion_numeros_repetidos = repetidos * 2;
        
//        System.out.println("COMPROBAR NUMEROS REPETIDOS: " + repetidos);
//        System.out.println("Puntuación de numeros repetidos: " 
//                + puntuacion_numeros_repetidos);
//        System.out.println("    \n");
        return puntuacion_numeros_repetidos;
    } 
    
    /*
     * ***********************************************************************
     *                              Falta mirar bien la puntuacion¡¡¡¡¡
     * ***********************************************************************
     */
    /*
     * Método para comprobar los caracteres repetidos
     */
    private int Caracteres_Repetidos(String texto){
//        System.out.println("*********************************************");
//        System.out.println("              CARACTERES REPETIDOS");
//        System.out.println("*********************************************\n");
        int puntuacion_caracteres_repetidos;
        
        int i, j, repetidos = 0;
        String aux;
        ArrayList lista = new ArrayList();
        for(i=0; i<texto.length(); i++){
            lista.add(texto.charAt(i)+"");
        }
        
        for(j=0; j<lista.size();j++){
            aux = (String) lista.get(j);
            lista.remove(j);
            if(lista.contains(aux)){
                repetidos = repetidos + 1;
            }
        }
        
        //************************* AQUI ***********************************
        puntuacion_caracteres_repetidos = (repetidos*(repetidos-1));
        
        
//        System.out.println("COMPROBAR CARACTERES REPETIDOS: " + repetidos);
//        System.out.println("Puntuación de caracteres repetidos " 
//                + puntuacion_caracteres_repetidos);
//        System.out.println("    \n");
        return puntuacion_caracteres_repetidos;
    }
   
    /*
     * ***********************************************************************
     * *********************************************************************** 
     *  Preguntar secuencia de numeros y secuencia de letras pagina web
     * ***********************************************************************
     * ***********************************************************************
     */
    
    private int Secuencia_Numeros(String texto){
//        System.out.println("*********************************************");
//        System.out.println("              SECUENCIA DE NUMEROS");
//        System.out.println("*********************************************\n");
        int puntuacion_secuencia_numeros = 0;
        int i, secuencia=0, resultado=0;
        
        for(i=1; i<texto.length(); i++){
            if((Character.isDigit(texto.charAt(i-1)) && (Character.isDigit(texto.charAt(i))))){
                secuencia++;
                if(secuencia >= SECUENCIA ){
                   resultado++;
                   System.out.println("AQUIIIIIIIIIIIIIIIIIIIIIIIIIIIII " + resultado);
                }
            }else{
                secuencia = 0;
            }
        }
        
        puntuacion_secuencia_numeros = resultado* 4;
//        System.out.println("SECUENCIA DE NUMEROS: ");
//        System.out.println("Puntuación de secuencia de numeros " + puntuacion_secuencia_numeros);
//        System.out.println("    \n");
        return puntuacion_secuencia_numeros;
    }
}
